package com.tools.web.work.excel.poi;

import com.tools.common.object.Note;

/**
 * Excel 工作簿的类型枚举
 * */
@Note("Excel 工作簿的类型枚举")
public enum ExcelTypeEnum {

    @Note("Excel 2007 之后的版本，后缀为【.xlsx】，最大可容纳 1048576 行、16384 列数据")
    XSSF(".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),

    @Note("Excel 2003 之前的版本，后缀为【.xls】，最大可容纳 65536 行、256 列数据")
    HSSF(".xls", "application/vnd.ms-excel"),

    @Note("是 XSSF 的一个扩展，后缀名也是【.xlsx】。它用于解决大数据量的导入导出，避免内存溢出的问题。一般数据量超过 5000 就可以用了")
    SXSSF(".xlsx2", ".xlsx2application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");


    /* ************************************************************************************************************
     *
     *      构造器
     *
     * ************************************************************************************************************
     * */

    @Note("后缀名称")
    private final String suffix;

    @Note("MIME 类型")
    private final String mimeType;

    ExcelTypeEnum(String suffix, String mimeType) {
        this.suffix = suffix;
        this.mimeType = mimeType;
    }

    /* ************************************************************************************************************
     *
     *      Getter / Setter
     *
     * ************************************************************************************************************
     * */

    public String getSuffix() {
        return suffix;
    }

    public String getMimeType() {
        return mimeType;
    }

    public boolean eqSuffix(String suffix) {
        return this.suffix.equals(suffix);
    }

    public boolean eqSuffixIgnoreCase(String suffix) {
        return this.suffix.equalsIgnoreCase(suffix);
    }

    public boolean eqMimeType(String mimeType) {
        return this.mimeType.equals(mimeType);
    }

    public boolean eqMimeTypeIgnoreCase(String mimeType) {
        return this.mimeType.equalsIgnoreCase(mimeType);
    }

    @Override
    public String toString() {
        return this.name();
    }

    /* ************************************************************************************************************
     *
     *      静态方法
     *
     * ************************************************************************************************************
     * */

    @Note("安全地根据 Excel 的后缀名获取对应的枚举实例，获取不到不会抛异常")
    public static ExcelTypeEnum getEnumSafeBySuffix(String suffix) {
        if(suffix == null || suffix.isEmpty()) return null;
        switch (suffix) {
            case ".xlsx": return XSSF;
            case ".xls": return HSSF;
            case ".xlsx2": return SXSSF;
            default: return null;
        }
    }


    @Note("根据 Excel 的后缀名获取对应的枚举实例，获取不到会抛异常")
    public static ExcelTypeEnum getEnumBySuffix(String suffix) {
        ExcelTypeEnum excelType = getEnumSafeBySuffix(suffix);
        if(excelType == null) throw new IllegalArgumentException("不知道 " + suffix + " 是什么 Excel 的后缀名");
        return excelType;
    }

    @Note("安全地根据 Excel 的 MIME 类型获取对应的枚举实例，获取不到不会抛异常")
    public static ExcelTypeEnum getEnumSafeByMimeType(String mimeType) {
        if(mimeType == null || mimeType.isEmpty()) return null;
        switch (mimeType) {
            case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": return XSSF;
            case "application/vnd.ms-excel": return HSSF;
            case ".xlsx2application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": return SXSSF;
            default: return null;
        }
    }


    @Note("根据 Excel 的 mime 类型获取对应的枚举实例，获取不到会抛异常")
    public static ExcelTypeEnum getEnumByMimeType(String mimeType) {
        ExcelTypeEnum excelType = getEnumSafeByMimeType(mimeType);
        if(excelType == null) throw new IllegalArgumentException("不知道 " + mimeType + " 是什么 MIME 类型");
        return excelType;
    }
}
